extends Node

var nav_layer: 导航层
var visual_layer: TileMapLayer

func 初始化():
	nav_layer = null
	visual_layer = null

func 获取网格坐标(world_position:Vector2) -> Vector2i:
	return nav_layer.local_to_map(nav_layer.to_local(world_position))
	
func 获取世界坐标(grid_position:Vector2i) -> 	Vector2:
	return nav_layer.to_global( nav_layer.map_to_local(grid_position) )

func 获取鼠标世界坐标() -> Vector2:
	return nav_layer.get_global_mouse_position()
	
func 获取鼠标网格坐标() -> Vector2i:
	return 	获取网格坐标(获取鼠标世界坐标())


func 获取导航网格路径(start:Vector2i, end:Vector2i) -> Array[Vector2i]:
	#print(start, end)
	return nav_layer.a_star.get_id_path(start, end)
	
	
func 获取导航世界路径(start:Vector2i, end:Vector2i) -> Array[Vector2]:	
	var arr = 获取导航网格路径(start, end)
	#print(arr)
	var arr2:Array[Vector2] = []
	for p in  arr:
		arr2.append(获取世界坐标(p))
	return arr2
	
	
func 获取网格路径长度(path:Array[Vector2i]) -> int:
	if path.size()<=1:
		return 0
	return path.size() - 1
	
		
	
func 是否有效网格(p: Vector2i) -> bool:
	return nav_layer.网格数据集.has(p)
	
# 障碍物或者被其他角色占据的，都是不可行走	
func 是否可行走网格(p: Vector2i) -> bool:
	return 是否有效网格(p) and nav_layer.网格数据集[p].可行走
	
func 是否是障碍物网格(p: Vector2i) -> bool:
	if 是否被角色占用网格(p):
		return false
	if 	是否可行走网格(p):
		return false
	
	return true	

	
	
func 设置网格可行走(p:Vector2i, b: bool):
	if 	not 是否有效网格(p):
		return 
	
	nav_layer.网格数据集[p].可行走 = b
	#nav_layer.a_star.set_point_solid(p, !b)
		
	
func 是否被角色占用网格(p:Vector2i) -> bool:
	return 是否有效网格(p) and nav_layer.网格数据集[p].	是否被占用()
	
func 是否被队友占用网格(p:Vector2i, 当前角色:角色单位) -> bool:
	if not 是否被角色占用网格(p):
		return false
	return 获取占用网格的角色(p).队伍id == 当前角色.队伍id
		
	
func 获取占用网格的角色(p:Vector2i) -> 角色单位:
	if not 是否有效网格(p):
		return null
	
	return 	nav_layer.网格数据集[p].占用单位
		
func 设置网格占用角色(p:Vector2i, d:角色单位):
	if 	not 是否有效网格(p):
		return 
	
	nav_layer.网格数据集[p].占用单位 = 	d
	
	
func 获取范围网格集合(中心网格:Vector2i, len:int, type:int=0) -> Array[Vector2i]:
	var arr:Array[Vector2i] = []
	for i in range(-len, len+1):
		for j in range(-len, len+1):
			if i==0 and j==0:
				continue
			var g = 中心网格 + Vector2i(i, j)
			arr.append(g)
	
	return arr
	
	
func 判断两网格连线间是否有障碍物(a1:Vector2i, b1:Vector2i) -> bool:
	var a = 获取世界坐标(a1)
	var b = 获取世界坐标(b1)
	var ray =  PhysicsRayQueryParameters2D.create(a, b, 2)
	var result = get_tree().root.world_2d.direct_space_state.intersect_ray(ray)

	return not result.is_empty()
	
	
func 显示技能范围(grids: Array[Vector2i], color:Color = Color.WHITE):
	visual_layer.clear()	
	visual_layer.modulate = color
	visual_layer.set_cells_terrain_connect(grids, 0 ,0)
	
	
func 获取范围内的可攻击目标(unit: 角色单位, grids: Array[Vector2i]) -> Array[角色单位]:
	var results:Array[角色单位] = []
	for g in grids:
		if 是否被角色占用网格(g):
			var unit2 = 获取占用网格的角色(g)
			if unit.队伍id != unit2.队伍id:
				results.append(unit2)	
	
	return results
